{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 第五步：调整正则化参数：reg_alpha 和reg_lambda"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/Users/karen/anaconda3/lib/python3.6/site-packages/sklearn/cross_validation.py:41: DeprecationWarning: This module was deprecated in version 0.18 in favor of the model_selection module into which all the refactored classes and functions are moved. Also note that the interface of the new CV iterators are different from that of this module. This module will be removed in 0.20.\n",
      "  \"This module will be removed in 0.20.\", DeprecationWarning)\n"
     ]
    }
   ],
   "source": [
    "from xgboost import XGBClassifier\n",
    "import xgboost as xgb\n",
    "\n",
    "import pandas as pd \n",
    "import numpy as np\n",
    "\n",
    "import math\n",
    "\n",
    "from sklearn.model_selection import GridSearchCV\n",
    "from sklearn.model_selection import StratifiedKFold\n",
    "\n",
    "from sklearn.metrics import log_loss\n",
    "\n",
    "from matplotlib import pyplot\n",
    "import seaborn as sns\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style>\n",
       "    .dataframe thead tr:only-child th {\n",
       "        text-align: right;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: left;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>bathrooms</th>\n",
       "      <th>bedrooms</th>\n",
       "      <th>price</th>\n",
       "      <th>price_bathrooms</th>\n",
       "      <th>price_bedrooms</th>\n",
       "      <th>room_diff</th>\n",
       "      <th>room_num</th>\n",
       "      <th>Year</th>\n",
       "      <th>Month</th>\n",
       "      <th>Day</th>\n",
       "      <th>...</th>\n",
       "      <th>walk</th>\n",
       "      <th>walls</th>\n",
       "      <th>war</th>\n",
       "      <th>washer</th>\n",
       "      <th>water</th>\n",
       "      <th>wheelchair</th>\n",
       "      <th>wifi</th>\n",
       "      <th>windows</th>\n",
       "      <th>work</th>\n",
       "      <th>interest_level</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1.5</td>\n",
       "      <td>3</td>\n",
       "      <td>3000</td>\n",
       "      <td>1200.0</td>\n",
       "      <td>750.000000</td>\n",
       "      <td>-1.5</td>\n",
       "      <td>4.5</td>\n",
       "      <td>2016</td>\n",
       "      <td>6</td>\n",
       "      <td>24</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1.0</td>\n",
       "      <td>2</td>\n",
       "      <td>5465</td>\n",
       "      <td>2732.5</td>\n",
       "      <td>1821.666667</td>\n",
       "      <td>-1.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>2016</td>\n",
       "      <td>6</td>\n",
       "      <td>12</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>1.0</td>\n",
       "      <td>1</td>\n",
       "      <td>2850</td>\n",
       "      <td>1425.0</td>\n",
       "      <td>1425.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>2.0</td>\n",
       "      <td>2016</td>\n",
       "      <td>4</td>\n",
       "      <td>17</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>1.0</td>\n",
       "      <td>1</td>\n",
       "      <td>3275</td>\n",
       "      <td>1637.5</td>\n",
       "      <td>1637.500000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>2.0</td>\n",
       "      <td>2016</td>\n",
       "      <td>4</td>\n",
       "      <td>18</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>1.0</td>\n",
       "      <td>4</td>\n",
       "      <td>3350</td>\n",
       "      <td>1675.0</td>\n",
       "      <td>670.000000</td>\n",
       "      <td>-3.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>2016</td>\n",
       "      <td>4</td>\n",
       "      <td>28</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 228 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "   bathrooms  bedrooms  price  price_bathrooms  price_bedrooms  room_diff  \\\n",
       "0        1.5         3   3000           1200.0      750.000000       -1.5   \n",
       "1        1.0         2   5465           2732.5     1821.666667       -1.0   \n",
       "2        1.0         1   2850           1425.0     1425.000000        0.0   \n",
       "3        1.0         1   3275           1637.5     1637.500000        0.0   \n",
       "4        1.0         4   3350           1675.0      670.000000       -3.0   \n",
       "\n",
       "   room_num  Year  Month  Day       ...        walk  walls  war  washer  \\\n",
       "0       4.5  2016      6   24       ...           0      0    0       0   \n",
       "1       3.0  2016      6   12       ...           0      0    0       0   \n",
       "2       2.0  2016      4   17       ...           0      0    0       0   \n",
       "3       2.0  2016      4   18       ...           0      0    0       0   \n",
       "4       5.0  2016      4   28       ...           0      0    1       0   \n",
       "\n",
       "   water  wheelchair  wifi  windows  work  interest_level  \n",
       "0      0           0     0        0     0               1  \n",
       "1      0           0     0        0     0               2  \n",
       "2      0           0     0        0     0               0  \n",
       "3      0           0     0        0     0               2  \n",
       "4      0           0     0        0     0               2  \n",
       "\n",
       "[5 rows x 228 columns]"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# path to where the data lies\n",
    "dpath = './data/'\n",
    "train = pd.read_csv(dpath +\"RentListingInquries_FE_train.csv\")\n",
    "train.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# 将数据分割训练数据与测试数据\n",
    "from sklearn.model_selection import train_test_split\n",
    "\n",
    "# 获取特征，标签\n",
    "y = train['interest_level']\n",
    "X = train.drop(['interest_level'], axis=1)\n",
    "\n",
    "# 由于数据集较大，在此随机采样30%的数据构建训练样本，其余作为测试样本\n",
    "X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=33, test_size=0.7, stratify=y)\n",
    "X_train = np.array(X_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# prepare cross validation\n",
    "# 各类样本不均衡，交叉验证是采用StratifiedKFold，在每折采样时各类样本按比例采样\n",
    "kfold = StratifiedKFold(n_splits=5, shuffle=True, random_state=3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'reg_alpha': [1.5, 2], 'reg_lambda': [0.5, 1, 2]}"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 正则参数\n",
    "reg_alpha = [ 1.5, 2]    #default = 0, 测试0.1,1，1.5，2\n",
    "reg_lambda = [0.5, 1, 2]      #default = 1，测试0.1， 0.5， 1，2\n",
    "\n",
    "param_test5_1 = dict(reg_alpha=reg_alpha, reg_lambda=reg_lambda)\n",
    "param_test5_1\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/Users/karen/anaconda3/lib/python3.6/site-packages/sklearn/model_selection/_search.py:761: DeprecationWarning: The grid_scores_ attribute was deprecated in version 0.18 in favor of the more elaborate cv_results_ attribute. The grid_scores_ attribute will not be available from 0.20\n",
      "  DeprecationWarning)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "([mean: -0.60995, std: 0.00452, params: {'reg_alpha': 1.5, 'reg_lambda': 0.5},\n",
       "  mean: -0.60989, std: 0.00412, params: {'reg_alpha': 1.5, 'reg_lambda': 1},\n",
       "  mean: -0.61011, std: 0.00474, params: {'reg_alpha': 1.5, 'reg_lambda': 2},\n",
       "  mean: -0.61000, std: 0.00455, params: {'reg_alpha': 2, 'reg_lambda': 0.5},\n",
       "  mean: -0.60990, std: 0.00457, params: {'reg_alpha': 2, 'reg_lambda': 1},\n",
       "  mean: -0.61038, std: 0.00465, params: {'reg_alpha': 2, 'reg_lambda': 2}],\n",
       " {'reg_alpha': 1.5, 'reg_lambda': 1},\n",
       " -0.60988606461013983)"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 代入前面获得的最优参数\n",
    "xgb5_1 = XGBClassifier(\n",
    "        learning_rate =0.1,\n",
    "        n_estimators=124,  \n",
    "        max_depth=5,\n",
    "        min_child_weight=4,\n",
    "        gamma=0,\n",
    "        subsample=0.8,\n",
    "        colsample_bytree=0.9,\n",
    "        colsample_bylevel = 0.7,\n",
    "        objective= 'multi:softprob',\n",
    "        seed=3)\n",
    "\n",
    "\n",
    "gsearch5_1 = GridSearchCV(xgb5_1, param_grid = param_test5_1, scoring='neg_log_loss',n_jobs=-1, cv=kfold)\n",
    "gsearch5_1.fit(X_train , y_train)\n",
    "\n",
    "gsearch5_1.grid_scores_, gsearch5_1.best_params_,     gsearch5_1.best_score_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/Users/karen/anaconda3/lib/python3.6/site-packages/sklearn/utils/deprecation.py:122: FutureWarning: You are accessing a training score ('mean_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "/Users/karen/anaconda3/lib/python3.6/site-packages/sklearn/utils/deprecation.py:122: FutureWarning: You are accessing a training score ('split0_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "/Users/karen/anaconda3/lib/python3.6/site-packages/sklearn/utils/deprecation.py:122: FutureWarning: You are accessing a training score ('split1_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "/Users/karen/anaconda3/lib/python3.6/site-packages/sklearn/utils/deprecation.py:122: FutureWarning: You are accessing a training score ('split2_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "/Users/karen/anaconda3/lib/python3.6/site-packages/sklearn/utils/deprecation.py:122: FutureWarning: You are accessing a training score ('split3_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "/Users/karen/anaconda3/lib/python3.6/site-packages/sklearn/utils/deprecation.py:122: FutureWarning: You are accessing a training score ('split4_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "/Users/karen/anaconda3/lib/python3.6/site-packages/sklearn/utils/deprecation.py:122: FutureWarning: You are accessing a training score ('std_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "{'mean_fit_time': array([ 34.06463795,  32.48602428,  32.18020592,  32.15753407,\n",
       "         31.71068349,  26.58220778]),\n",
       " 'mean_score_time': array([ 0.11397862,  0.11229482,  0.10862813,  0.11329145,  0.11113648,\n",
       "         0.1006887 ]),\n",
       " 'mean_test_score': array([-0.6099465 , -0.60988606, -0.61010526, -0.61000428, -0.60989542,\n",
       "        -0.61038187]),\n",
       " 'mean_train_score': array([-0.49162764, -0.49321179, -0.49578738, -0.49434335, -0.49593323,\n",
       "        -0.49876695]),\n",
       " 'param_reg_alpha': masked_array(data = [1.5 1.5 1.5 2 2 2],\n",
       "              mask = [False False False False False False],\n",
       "        fill_value = ?),\n",
       " 'param_reg_lambda': masked_array(data = [0.5 1 2 0.5 1 2],\n",
       "              mask = [False False False False False False],\n",
       "        fill_value = ?),\n",
       " 'params': [{'reg_alpha': 1.5, 'reg_lambda': 0.5},\n",
       "  {'reg_alpha': 1.5, 'reg_lambda': 1},\n",
       "  {'reg_alpha': 1.5, 'reg_lambda': 2},\n",
       "  {'reg_alpha': 2, 'reg_lambda': 0.5},\n",
       "  {'reg_alpha': 2, 'reg_lambda': 1},\n",
       "  {'reg_alpha': 2, 'reg_lambda': 2}],\n",
       " 'rank_test_score': array([3, 1, 5, 4, 2, 6], dtype=int32),\n",
       " 'split0_test_score': array([-0.60387391, -0.60431106, -0.60411088, -0.60358901, -0.60300237,\n",
       "        -0.60338284]),\n",
       " 'split0_train_score': array([-0.49332734, -0.49475535, -0.49665314, -0.49476103, -0.49645503,\n",
       "        -0.49968367]),\n",
       " 'split1_test_score': array([-0.61738828, -0.61687543, -0.61840563, -0.61766379, -0.61741717,\n",
       "        -0.6179361 ]),\n",
       " 'split1_train_score': array([-0.48985764, -0.49123482, -0.49419419, -0.4917858 , -0.49414431,\n",
       "        -0.49767769]),\n",
       " 'split2_test_score': array([-0.61126585, -0.61055657, -0.61043432, -0.61057233, -0.60989944,\n",
       "        -0.61091701]),\n",
       " 'split2_train_score': array([-0.49048368, -0.49322649, -0.49584372, -0.49382006, -0.49632761,\n",
       "        -0.49809342]),\n",
       " 'split3_test_score': array([-0.60707112, -0.60775198, -0.60742662, -0.60815209, -0.60922401,\n",
       "        -0.60902114]),\n",
       " 'split3_train_score': array([-0.4914828 , -0.49347119, -0.49582816, -0.49464539, -0.49466566,\n",
       "        -0.49879344]),\n",
       " 'split4_test_score': array([-0.61013196, -0.6099341 , -0.61014716, -0.61004315, -0.60993368,\n",
       "        -0.61065168]),\n",
       " 'split4_train_score': array([-0.49298673, -0.4933711 , -0.49641769, -0.49670449, -0.49807354,\n",
       "        -0.49958656]),\n",
       " 'std_fit_time': array([ 0.67680551,  0.27682141,  0.09098569,  0.03454575,  0.17762429,\n",
       "         6.4415213 ]),\n",
       " 'std_score_time': array([ 0.00916343,  0.01205317,  0.00530973,  0.0048771 ,  0.00784616,\n",
       "         0.01498836]),\n",
       " 'std_test_score': array([ 0.00452389,  0.00412222,  0.00473597,  0.00455217,  0.00457336,\n",
       "         0.00465401]),\n",
       " 'std_train_score': array([ 0.00135636,  0.00112994,  0.00085906,  0.00159095,  0.00140112,\n",
       "         0.0007941 ])}"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "gsearch5_1.cv_results_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Best: -0.609886 using {'reg_alpha': 1.5, 'reg_lambda': 1}\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/Users/karen/anaconda3/lib/python3.6/site-packages/sklearn/utils/deprecation.py:122: FutureWarning: You are accessing a training score ('mean_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "/Users/karen/anaconda3/lib/python3.6/site-packages/sklearn/utils/deprecation.py:122: FutureWarning: You are accessing a training score ('std_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "/Users/karen/anaconda3/lib/python3.6/site-packages/sklearn/utils/deprecation.py:122: FutureWarning: You are accessing a training score ('split0_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "/Users/karen/anaconda3/lib/python3.6/site-packages/sklearn/utils/deprecation.py:122: FutureWarning: You are accessing a training score ('split1_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "/Users/karen/anaconda3/lib/python3.6/site-packages/sklearn/utils/deprecation.py:122: FutureWarning: You are accessing a training score ('split2_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "/Users/karen/anaconda3/lib/python3.6/site-packages/sklearn/utils/deprecation.py:122: FutureWarning: You are accessing a training score ('split3_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "/Users/karen/anaconda3/lib/python3.6/site-packages/sklearn/utils/deprecation.py:122: FutureWarning: You are accessing a training score ('split4_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x1a1260a400>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# summarize results\n",
    "print(\"Best: %f using %s\" % (gsearch5_1.best_score_, gsearch5_1.best_params_))\n",
    "test_means = gsearch5_1.cv_results_[ 'mean_test_score' ]\n",
    "test_stds = gsearch5_1.cv_results_[ 'std_test_score' ]\n",
    "train_means = gsearch5_1.cv_results_[ 'mean_train_score' ]\n",
    "train_stds = gsearch5_1.cv_results_[ 'std_train_score' ]\n",
    "\n",
    "pd.DataFrame(gsearch5_1.cv_results_).to_csv('my_preds_reg_alpha_reg_lambda_1.csv')\n",
    "\n",
    "# plot results\n",
    "test_scores = np.array(test_means).reshape(len(reg_alpha), len(reg_lambda))\n",
    "train_scores = np.array(train_means).reshape(len(reg_alpha), len(reg_lambda))\n",
    "\n",
    "#log_reg_alpha = [0,0,0,0]\n",
    "#for index in range(len(reg_alpha)):\n",
    "#   log_reg_alpha[index] = math.log10(reg_alpha[index])\n",
    "    \n",
    "for i, value in enumerate(reg_alpha):\n",
    "    pyplot.plot(reg_lambda, -test_scores[i], label= 'reg_alpha:'   + str(value))\n",
    "#for i, value in enumerate(min_child_weight):\n",
    "#    pyplot.plot(max_depth, train_scores[i], label= 'train_min_child_weight:'   + str(value))\n",
    "    \n",
    "pyplot.legend()\n",
    "pyplot.xlabel( 'reg_lambda' )                                                                                                      \n",
    "pyplot.ylabel( '-Log Loss' )\n",
    "pyplot.savefig( 'reg_alpha_vs_reg_lambda1.png' )"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
